mappings = {
  "é" : { h: "e", k: "e" }
  "ū" : { h: "uu", k: "uu" }
  "ō" : { h: "oう", k: "oー" }
  "n" : { h: "ん", k: "ン" }
  "tsu" : { h: "つ", k: "ツ" }
  "kya" : { h: "きゃ", k: "キャ" }
  "kyu" : { h: "きゅ", k: "キュ" }
  "kyo" : { h: "きょ", k: "キョ" }
  "んya" : { h: "にゃ", k: "ニャ" }
  "んyu" : { h: "にゅ", k: "ニュ" }
  "んyo" : { h: "にょ", k: "ニョ" }
  "sha" : { h: "しゃ", k: "シャ" }
  "shi" : { h: "し", k: "シ" }
  "shu" : { h: "しゅ", k: "シュ" }
  "sho" : { h: "しょ", k: "ショ" }
  "chi" : { h: "ち", k: "チ" }
  "cha" : { h: "ちゃ", k: "チャ" }
  "chu" : { h: "ちゅ", k: "チュ" }
  "cho" : { h: "ちょ", k: "チョ" }
  "hya" : { h: "ひゃ", k: "ヒャ" }
  "hyu" : { h: "ひゅ", k: "ヒュ" }
  "hyo" : { h: "ひょ", k: "ヒョ" }
  "mya" : { h: "みゃ", k: "ミャ" }
  "myu" : { h: "みゅ", k: "ミュ" }
  "myo" : { h: "みょ", k: "ミョ" }
  "rya" : { h: "りゃ", k: "リャ" }
  "ryu" : { h: "りゅ", k: "リュ" }
  "ryo" : { h: "りょ", k: "リョ" }
  "gya" : { h: "ぎゃ", k: "ギャ" }
  "gyu" : { h: "ぎゅ", k: "ギュ" }
  "gyo" : { h: "ぎょ", k: "ギョ" }
  "bya" : { h: "びゃ", k: "ビャ" }
  "byu" : { h: "びゅ", k: "ビュ" }
  "byo" : { h: "びょ", k: "ビョ" }
  "pya" : { h: "ぴゃ", k: "ピャ" }
  "pyu" : { h: "ぴゅ", k: "ピュ" }
  "pyo" : { h: "ぴょ", k: "ピョ" }
  "ja" : { h: "じゃ", k: "ジャ" }
  "ju" : { h: "じゅ", k: "ジュ" }
  "jo" : { h: "じょ", k: "ジョ" }
  "ba" : { h: "ば", k: "バ" }
  "da" : { h: "だ", k: "ダ" }
  "ga" : { h: "が", k: "ガ" }
  "ha" : { h: "は", k: "ハ" }
  "ka" : { h: "か", k: "カ" }
  "ma" : { h: "ま", k: "マ" }
  "んa" : { h: "な", k: "ナ" }
  "pa" : { h: "ぱ", k: "パ" }
  "ra" : { h: "ら", k: "ラ" }
  "sa" : { h: "さ", k: "サ" }
  "ta" : { h: "た", k: "タ" }
  "wa" : { h: "わ", k: "ワ" }
  "ya" : { h: "や", k: "ヤ" }
  "za" : { h: "ざ", k: "ザ" }
  "a" : { h: "あ", k: "ア" }
  "be" : { h: "べ", k: "ベ" }
  "de" : { h: "で", k: "デ" }
  "ge" : { h: "げ", k: "ゲ" }
  "he" : { h: "へ", k: "ヘ" }
  "ke" : { h: "け", k: "ケ" }
  "me" : { h: "め", k: "メ" }
  "んe" : { h: "ね", k: "ネ" }
  "pe" : { h: "ぺ", k: "ペ" }
  "re" : { h: "れ", k: "レ" }
  "se" : { h: "せ", k: "セ" }
  "te" : { h: "て", k: "テ" }
  "ze" : { h: "ぜ", k: "ゼ" }
  "e" : { h: "え", k: "エ" }
  "bi" : { h: "び", k: "ビ" }
  "gi" : { h: "ぎ", k: "ギ" }
  "hi" : { h: "ひ", k: "ヒ" }
  "ki" : { h: "き", k: "キ" }
  "mi" : { h: "み", k: "ミ" }
  "んi" : { h: "に", k: "ニ" }
  "pi" : { h: "ぴ", k: "ピ" }
  "ri" : { h: "り", k: "リ" }
  "ji" : { h: "じ", k: "ジ" }
  "i" : { h: "い", k: "イ" }
  "bo" : { h: "ぼ", k: "ボ" }
  "do" : { h: "ど", k: "ド" }
  "go" : { h: "ご", k: "ゴ" }
  "ho" : { h: "ほ", k: "ホ" }
  "ko" : { h: "こ", k: "コ" }
  "mo" : { h: "も", k: "モ" }
  "んo" : { h: "の", k: "ノ" }
  "po" : { h: "ぽ", k: "ポ" }
  "ro" : { h: "ろ", k: "ロ" }
  "so" : { h: "そ", k: "ソ" }
  "to" : { h: "と", k: "ト" }
  "wo" : { h: "を", k: "ヲ" }
  "yo" : { h: "よ", k: "ヨ" }
  "zo" : { h: "ぞ", k: "ゾ" }
  "o" : { h: "お", k: "オ" }
  "bu" : { h: "ぶ", k: "ブ" }
  "gu" : { h: "ぐ", k: "グ" }
  "fu" : { h: "ふ", k: "フ" }
  "ku" : { h: "く", k: "ク" }
  "mu" : { h: "む", k: "ム" }
  "んu" : { h: "ぬ", k: "ヌ" }
  "pu" : { h: "ぷ", k: "プ" }
  "ru" : { h: "る", k: "ル" }
  "su" : { h: "す", k: "ス" }
  "yu" : { h: "ゆ", k: "ユ" }
  "zu" : { h: "ず", k: "ズ" }
  "u" : { h: "う", k: "ウ" }
  "v" : { h: "ゔ", k: "ヴ" }
}

app.japanese = {
  switch: ->
    if $('#jpinputwidget').val() == "Katakana" then app.jp_input_method = "k" else app.jp_input_method = "h"
}

app.input_methods["jp"] = {
  widget: "
    <select id='jpinputwidget' onchange='app.japanese.switch()'>
    <option>Hiragana</option>
    <option>Katakana</option>
    </select>
  "
  initialize: ->
    app.jp_input_method = "h"
  key_release: (text) ->
    for original, mapping of mappings
      if app.jp_input_method == 'k'
        text = text.replace /[bcdfghjklmnpqrsvwxyz](?=[bcdfgjklmnpqrstvwxyz])|t(?=t)/, "ッ"
      else
        text = text.replace /[bcdfghjklmnpqrsvwxyz](?=[bcdfgjklmnpqrstvwxyz])|t(?=t)/, "っ"
      text = text.replace original, mapping[app.jp_input_method]
    return text
}